home *** CD-ROM | disk | FTP | other *** search
/ BCI NET 2 / BCI NET 2.iso / archives / programming / source / term43-source.lha / Extras / Source / gtlayout-Source.lha / LTP_LevelGadget.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-11-20  |  6.1 KB  |  281 lines

  1. /*  GadTools layout toolkit
  2. **
  3. **  Copyright © 1993-1994 by Olaf `Olsen' Barthel
  4. **  Freely distributable.
  5. */
  6.  
  7. #include "gtlayout_global.h"
  8.  
  9. #ifdef DO_LEVEL_KIND
  10. VOID __regargs
  11. LTP_LevelGadgetDrawLabel(struct Gadget *Gadget,BOOL FullRefresh)
  12. {
  13.     LevelExtra    *Special = (LevelExtra *)Gadget -> SpecialInfo;
  14.     LONG         Current;
  15.     ObjectNode    *Node = (ObjectNode *)Gadget -> UserData;
  16.  
  17.     GetAttr(LVIA_Current,Special -> LevelImage,(ULONG *)&Current);
  18.  
  19.     Current += Special -> Plus;
  20.  
  21.     Special -> Level = Current;
  22.  
  23.     if(Node -> Label)
  24.     {
  25.         struct RastPort *RPort = &Special -> Handle -> RPort;
  26.         LONG         LabelTop;
  27.         LayoutHandle    *Handle = Special -> Handle;
  28.  
  29.         LabelTop = (Gadget -> Height - RPort -> TxHeight) / 2;
  30.  
  31.         LTP_SetPens(RPort,Handle -> TextPen,Handle -> BackgroundPen,JAM2);
  32.  
  33.         if(FullRefresh)
  34.             LTP_PrintLabel(Handle,Node,Gadget -> LeftEdge,Gadget -> TopEdge + LabelTop);
  35.  
  36.         if(Special -> LevelFormat)
  37.         {
  38.             UBYTE    Buffer[256];
  39.             WORD    LevelWidth,
  40.                 LevelLen;
  41.  
  42.             if(Special -> DispFunc)
  43.                 Current = (*Special -> DispFunc)(Gadget,Current);
  44.  
  45.             sprintf(Buffer,Special -> LevelFormat,Current);
  46.  
  47.             LevelLen = strlen(Buffer);
  48.  
  49.             LevelWidth = TextLength(RPort,Buffer,LevelLen);
  50.  
  51.             Move(RPort,Gadget -> LeftEdge - INTERWIDTH - LevelWidth,Gadget -> TopEdge + LabelTop + RPort -> TxBaseline);
  52.             Text(RPort,Buffer,LevelLen);
  53.  
  54.             if(LevelWidth < Special -> MaxLevelWidth)
  55.             {
  56.                 WORD    Left    = Gadget -> LeftEdge - INTERWIDTH,
  57.                     Top    = Gadget -> TopEdge + LabelTop;
  58.  
  59.                 LTP_SetAPen(RPort,Handle -> BackgroundPen);
  60.  
  61.                 if(Special -> MaxLevelWidth >= LevelWidth - 1)
  62.                     RectFill(RPort,Left - Special -> MaxLevelWidth,Top,Left - LevelWidth - 1,Top + RPort -> TxHeight - 1);
  63.             }
  64.         }
  65.     }
  66. }
  67.  
  68. ULONG __regargs
  69. LTP_LevelGadgetRender(struct Gadget *Gadget,struct gpRender *RenderMsg)
  70. {
  71.     LevelExtra *Special = (LevelExtra *)Gadget -> SpecialInfo;
  72.  
  73.     DrawImageState(RenderMsg -> gpr_RPort,Special -> LevelImage,Gadget -> LeftEdge,Gadget -> TopEdge,Gadget -> Flags & GFLG_DISABLED ? IDS_DISABLED : IDS_NORMAL,Special -> Handle -> DrawInfo);
  74.  
  75.     LTP_LevelGadgetDrawLabel(Gadget,TRUE);
  76.  
  77.     return(TRUE);
  78. }
  79.  
  80. ULONG __regargs
  81. LTP_LevelGadgetGoActive(struct Gadget *Gadget,struct gpInput *InputMsg)
  82. {
  83.     LevelExtra    *Special = Gadget -> SpecialInfo;
  84.     LONG         Left;
  85.     ULONG         Position,
  86.              KnobWidth,
  87.              Current,
  88.              Max;
  89.     struct RastPort *RPort;
  90.  
  91.     GetAttr(LVIA_Position,    Special -> LevelImage,&Position);
  92.     GetAttr(LVIA_Current,    Special -> LevelImage,&Current);
  93.     GetAttr(LVIA_KnobWidth, Special -> LevelImage,&KnobWidth);
  94.     GetAttr(LVIA_Max,    Special -> LevelImage,&Max);
  95.  
  96.     Left = InputMsg -> gpi_Mouse . X;
  97.  
  98.     if(Left < Position)
  99.     {
  100.         if(Current > 0)
  101.         {
  102.             SetAttrs(Special -> LevelImage,LVIA_Current,Current - 1,TAG_DONE);
  103.  
  104.             if(RPort = ObtainGIRPort(InputMsg -> gpi_GInfo))
  105.             {
  106.                 DrawImageState(RPort,Special -> LevelImage,Gadget -> LeftEdge,Gadget -> TopEdge,IDS_NORMAL,Special -> Handle -> DrawInfo);
  107.  
  108.                 ReleaseGIRPort(RPort);
  109.             }
  110.  
  111.             LTP_LevelGadgetDrawLabel(Gadget,FALSE);
  112.         }
  113.  
  114.         *InputMsg -> gpi_Termination = FALSE;
  115.  
  116.         return(GMR_NOREUSE | GMR_VERIFY);
  117.     }
  118.  
  119.     if(Left > KnobWidth + Position + KnobWidth)
  120.     {
  121.         if(Current < Max)
  122.         {
  123.             SetAttrs(Special -> LevelImage,LVIA_Current,Current + 1,TAG_DONE);
  124.  
  125.             if(RPort = ObtainGIRPort(InputMsg -> gpi_GInfo))
  126.             {
  127.                 DrawImageState(RPort,Special -> LevelImage,Gadget -> LeftEdge,Gadget -> TopEdge,IDS_NORMAL,Special -> Handle -> DrawInfo);
  128.  
  129.                 ReleaseGIRPort(RPort);
  130.             }
  131.  
  132.             LTP_LevelGadgetDrawLabel(Gadget,FALSE);
  133.         }
  134.  
  135.         *InputMsg -> gpi_Termination = FALSE;
  136.  
  137.         return(GMR_NOREUSE | GMR_VERIFY);
  138.     }
  139.  
  140.     Special -> MidOffset = KnobWidth + Position - Left;
  141.  
  142.     if(RPort = ObtainGIRPort(InputMsg -> gpi_GInfo))
  143.     {
  144.         DrawImageState(RPort,Special -> LevelImage,Gadget -> LeftEdge,Gadget -> TopEdge,IDS_SELECTED,Special -> Handle -> DrawInfo);
  145.  
  146.         ReleaseGIRPort(RPort);
  147.     }
  148.  
  149.     return(GMR_MEACTIVE);
  150. }
  151.  
  152. ULONG __regargs
  153. LTP_LevelGadgetHandleInput(struct Gadget *Gadget,struct gpInput *InputMsg)
  154. {
  155.     if(InputMsg -> gpi_IEvent -> ie_Class == IECLASS_RAWMOUSE)
  156.     {
  157.         LevelExtra    *Special = Gadget -> SpecialInfo;
  158.         LONG         Left,Width;
  159.         ULONG         KnobWidth,
  160.                  Position,
  161.                  Current,
  162.                  Max,
  163.                  Result;
  164.         struct RastPort *RPort;
  165.         BOOL         DrawIt;
  166.  
  167.         GetAttr(LVIA_Position,    Special -> LevelImage,&Position);
  168.         GetAttr(LVIA_KnobWidth, Special -> LevelImage,&KnobWidth);
  169.         GetAttr(LVIA_Max,    Special -> LevelImage,&Max);
  170.  
  171.         Left = InputMsg -> gpi_Mouse . X + Special -> MidOffset - KnobWidth;
  172.  
  173.         Width = Special -> LevelImage -> Width - 2 * KnobWidth;
  174.  
  175.         if(InputMsg -> gpi_IEvent -> ie_Code == SELECTUP)
  176.         {
  177.             *InputMsg -> gpi_Termination = FALSE;
  178.  
  179.             Result = GMR_NOREUSE | GMR_VERIFY;
  180.         }
  181.         else
  182.             Result = 0;
  183.  
  184.         if(Left < 0)
  185.             Left = 0;
  186.         else
  187.         {
  188.             if(Left > Width)
  189.                 Left = Width;
  190.         }
  191.  
  192. //        Current = (Left * Max + Width - 1) / Width;
  193.  
  194.         if(Max)
  195.         {
  196.             Current = (Left * Max + (Width / (Max * 2))) / Width;
  197.  
  198.             if(Current > Max)
  199.                 Current = Max;
  200.             else
  201.             {
  202.                 if(Current < 0)
  203.                     Current = 0;
  204.             }
  205.         }
  206.         else
  207.             Current = 0;
  208.  
  209.         SetAttrs(Special -> LevelImage,LVIA_Current,Current,TAG_DONE);
  210.  
  211.         if(Result)
  212.             DrawIt = TRUE;
  213.         else
  214.         {
  215.             if(Position != Left && Max)
  216.             {
  217.                 DrawIt = TRUE;
  218.  
  219.                 SetAttrs(Special -> LevelImage,
  220.                     LVIA_Position,    Left,
  221.                 TAG_DONE);
  222.             }
  223.             else
  224.                 DrawIt = FALSE;
  225.         }
  226.  
  227.         if(DrawIt)
  228.         {
  229.             if(RPort = ObtainGIRPort(InputMsg -> gpi_GInfo))
  230.             {
  231.                 DrawImageState(RPort,Special -> LevelImage,Gadget -> LeftEdge,Gadget -> TopEdge,Result ? IDS_NORMAL : IDS_SELECTED,Special -> Handle -> DrawInfo);
  232.  
  233.                 ReleaseGIRPort(RPort);
  234.             }
  235.  
  236.             LTP_LevelGadgetDrawLabel(Gadget,FALSE);
  237.         }
  238.  
  239.         return(Result);
  240.     }
  241.     else
  242.         return(0);
  243. }
  244.  
  245. ULONG __saveds __asm
  246. LTP_LevelGadgetDispatcher(register __a0 struct Hook *Hook,register __a2 struct Gadget *Gadget,register __a1 Msg msg)
  247. {
  248.     ULONG Result;
  249.  
  250.     switch(msg -> MethodID)
  251.     {
  252.         case GM_HITTEST:
  253.  
  254.             Result = GMR_GADGETHIT;
  255.             break;
  256.  
  257.         case GM_RENDER:
  258.  
  259.             Result = LTP_LevelGadgetRender(Gadget,(struct gpRender *)msg);
  260.             break;
  261.  
  262.         case GM_GOACTIVE:
  263.  
  264.             Result = LTP_LevelGadgetGoActive(Gadget,(struct gpInput *)msg);
  265.             break;
  266.  
  267.         case GM_HANDLEINPUT:
  268.  
  269.             Result = LTP_LevelGadgetHandleInput(Gadget,(struct gpInput *)msg);
  270.             break;
  271.  
  272.         default:
  273.  
  274.             Result = 0;
  275.             break;
  276.     }
  277.  
  278.     return(Result);
  279. }
  280. #endif /* DO_LEVEL_KIND */
  281.